package myzzyl.service.Impl;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import myzzyl.constants.BedStatus;
import myzzyl.constants.ErrorConstants;
import myzzyl.domain.dto.BedDto;
import myzzyl.domain.pojo.Bed;
import myzzyl.domain.pojo.Room;
import myzzyl.domain.vo.BedVo;
import myzzyl.exception.BusinessException;
import myzzyl.mapper.BedMapper;
import myzzyl.mapper.RoomMapper;
import myzzyl.service.BedService;
import myzzyl.service.RoomService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;

/**
* @author 33249
* @description 针对表【bed】的数据库操作Service实现
* @createDate 2025-08-07 20:06:29
*/
@Service
public class BedServiceImpl extends ServiceImpl<BedMapper, Bed>
    implements BedService {


    @Autowired
    private RoomMapper roomMapper;


    /**
     * 获取房间下的所有床位
     * @param id 房间id
     * @return 返回值
     */
    @Override
    public List<BedVo> getAllByRoomId(Long id) {
        List<BedVo> bedList = roomMapper.getAllBedVo(id);
        return bedList;
    }


    /**
     * 获取床位详情
     * @param id 床位id
     * @return 返回值
     */
    @Override
    public Bed getInfo(Long id) {
        // 判断床位是否存在
        Bed bed = getById(id);
        if(bed == null) {
            throw new BusinessException(ErrorConstants.BED_IS_NOT_EXIST);
        }
        return bed;
    }

    /**
     * 新增床位
     * @param bedDto 床位表单包装类
     * @return 返回值
     */
    @Override
    public Boolean add(BedDto bedDto) {
        // 判断床位是否已经存在
        if(lambdaQuery()
                .eq(StrUtil.isNotBlank(bedDto.getBedNumber()), Bed::getBedNumber, bedDto.getBedNumber())
                .exists()) {
            throw new BusinessException(ErrorConstants.BED_IS_ALREADY_EXIST);
        }

        // 新增床位
        Bed bed = new Bed();
        BeanUtils.copyProperties(bedDto, bed);
        bed.setCreateTime(new Date());
        bed.setUpdateTime(new Date());
        bed.setCreateBy(1L);
        bed.setCreateBy(1L);
        bed.setBedStatus(BedStatus.NOT_LIVE.getStatus());

        return save(bed);
    }


    /**
     * 编辑床位
     * @param bedDto 床位表单包装类
     * @return 返回值
     */
    @Override
    public Boolean edit(BedDto bedDto) {
        // 判断床位是否已经存在(除去自己)
        if(lambdaQuery()
                .eq(StrUtil.isNotBlank(bedDto.getBedNumber()), Bed::getBedNumber, bedDto.getBedNumber())
                .ne(bedDto.getId() != null, Bed::getId, bedDto.getId())
                .exists()) {
            throw new BusinessException(ErrorConstants.BED_IS_ALREADY_EXIST);
        }

        // 更新床位
        return lambdaUpdate()
                .set(bedDto.getBedNumber() != null, Bed::getBedNumber, bedDto.getBedNumber())
                .set(bedDto.getSort() != null, Bed::getSort, bedDto.getSort())
                .eq(Bed::getId, bedDto.getId())
                .update();
    }


    /**
     * 删除床位
     * @param id 床位id
     * @return 返回值
     */
    @Override
    public Boolean deleteBedById(Long id) {
        // 判断要删除的床位是否存在
        if(!lambdaQuery().eq(id != null, Bed::getId, id).exists()) {
            throw new BusinessException(ErrorConstants.BED_IS_ALREADY_EXIST);
        }

        // 删除
        return baseMapper.deleteById(id) > 0;
    }


    /**
     * 获取房间下的总入住床位数
     * @param id 房间id
     * @return 返回值
     */
    @Override
    public Long getOccupiedBeds(Long id) {
        return lambdaQuery()
                .eq(Bed::getRoomId, id)
                .ne(Bed::getBedStatus, BedStatus.NOT_LIVE.getStatus())
                .count();
    }
}





